/////////////////////////////样式模板///////////////////////////////////
//点、线、面渲染总样式，包含不同地图级别样式
var _ZGStyle = {
    "StyleId": "id",
    "StyleName": "样式名称",
    "StyleType": "",
    "LevelList": []
};

//地图级别样式，可以放置如0-6级范围下的样式，包含分类渲染样式
var _LevelItem = {
    "Level": 18,
    "RenderField": "",
    "DiplayField": "",
    "ClassList": []
};

//分类渲染样式，放置，一定条件下的，OL样式json文件
var _ClassItem = {
    "FilterString": "",
    "OLStyle": {
        "Icon": {
            "src": "",
            "opacity": 1,
            "scale": 1
        },
        "Stroke": {
            "Color": "rgba(0,0,255,1)",
            "Width": 1,
            "LineDash": []
        },
        "Fill": {
            "Color": "rgba(0,0,0,0.2)",
            "imgsrc": "",
            "img": {}
        },
        "Text": {
            "Font": "bold 16px 宋体",
            "Fill": {
                "Color": "rgba(0,0,0,1)"
            },
            "Stroke": {
                "Color": "rgba(255,255,255,1)",
                "Width": 5,
                "LineDash": []
            },
            "offsetX": 0,
            "offsetY": 20
        }
    }
};

////////////////////图片填充工具///////////////////////////////////
var canvas = document.createElement('canvas');
var canvas_context = canvas.getContext('2d');
////////////////////图片填充工具///////////////////////////////////

//深度克隆对象
function getNewObj(obj) {
    if (obj === null) return null
    if (typeof obj !== 'object') return obj;
    if (obj.constructor === Date) return new Date(obj);
    var newObj = new obj.constructor();  //保持继承链
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {   //不遍历其原型链上的属性
            var val = obj[key];
            newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除与函数名的耦合
        }
    }
    return newObj;
};

//提供对外调用函数，总样式
function getNewZGStyle() {
    return getNewObj(_ZGStyle);
}

//提供对外调用函数，总样式
function getNewLevelStyle() {
    return getNewObj(_LevelItem);
}

//提供对外调用函数，总样式
function getNewClassStyle() {
    return getNewObj(_ClassItem);
}

/////////////////////////////样式模板///////////////////////////////////

//根据地图zoom获取当前使用的levelStyle
function getLevelStylebyZoom(zoom, styleJsonObj) {
    var levelStyle;
    var levelStyleList = [];//所以比当前zoom大的level
    for (var i = 0; i < styleJsonObj.LevelList.length; i++) {
        if (zoom <= styleJsonObj.LevelList[i].Level) {
            levelStyleList.push(styleJsonObj.LevelList[i])
        }
    }
    levelStyle = levelStyleList[0]
    for (var j = 0; j < levelStyleList.length; j++) {
        if (levelStyle.Level > levelStyleList[j].Level) {
            levelStyle = levelStyleList[j];
        }
    }
    return levelStyle;
}

//根据olstyleJson对象获取实体OLStyle
function getOLStylebyJson(OLStyleJson) {
    //如果传入json为null,则返回空
    if(OLStyleJson == null){
        return null;
    }

    //OL ,基础渲染样式
    var olStyle = new ol.style.Style();

    //Icon转换
    var _Icon = new ol.style.Icon({src: OLStyleJson.Icon.src});
    _Icon.setOpacity(OLStyleJson.Icon.opacity);
    _Icon.setScale(OLStyleJson.Icon.scale);
    olStyle.setImage(_Icon);

    //Text转换
    var _Text = new ol.style.Text();
    _Text.setFont(OLStyleJson.Text.Font);
    _Text.setOverflow(true);
    var _fillText = new ol.style.Fill();
    _fillText.setColor(OLStyleJson.Text.Fill.Color);
    _Text.setFill(_fillText);
    var _strokeText = new ol.style.Stroke();
    _strokeText.setColor(OLStyleJson.Text.Stroke.Color);
    _strokeText.setWidth(OLStyleJson.Text.Stroke.Width);
    _strokeText.setLineDash(OLStyleJson.Text.Stroke.LineDash);
    _Text.setStroke(_strokeText);
    _Text.setOffsetX(OLStyleJson.Text.offsetX);
    _Text.setOffsetY(OLStyleJson.Text.offsetY);

    olStyle.setText(_Text);

    //Stroke转换
    var _stroke = new ol.style.Stroke();
    _stroke.setColor(OLStyleJson.Stroke.Color);
    _stroke.setWidth(OLStyleJson.Stroke.Width);
    _stroke.setLineDash(OLStyleJson.Stroke.LineDash);
    olStyle.setStroke(_stroke)

    //Fill转换,由于加载img为异步处理，所有当用图片渲染面时，返回olstyle放在onload里面
    if (OLStyleJson.Fill.imgsrc == "") {
        var _fill = new ol.style.Fill();
        _fill.setColor(OLStyleJson.Fill.Color);
        olStyle.setFill(_fill);
    }
    else {
        var _fill = new ol.style.Fill();
        _fill.setColor(canvas_context.createPattern(OLStyleJson.Fill.img, 'repeat'));
        olStyle.setFill(_fill);
    }

    return olStyle;
}

//判断是否为数字
function isNumber(val) {
    var regPos = /^\d+(\.\d+)?$/; //非负浮点数
    var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
    if(regPos.test(val) || regNeg.test(val)) {
        return true;
    } else {
        return false;
    }
}

//根据具体feature获取对应的Style
function getOLStyleFeat(LevelStyle, feature) {
    var m_style = null;
    for (var i = 0; i < LevelStyle.ClassList.length; i++) {
        var value = feature.get(LevelStyle.RenderField);
        var filterString = LevelStyle.ClassList[i].FilterString;
        var isFit = 1;

        //">=,5&==,苏州",判断feature是否满足过滤条件，满足为isFit==1,不满足isFit==0
        var strs = filterString.split("&"); //字符分割
        for (var j = 0; j < strs.length; j++) {
            var fh = strs[j].split(",")[0];
            var val = strs[j].split(",")[1];
            if(isNumber(value) && isNumber(val))
            {
                value=Number(value);
                val=Number(val);
            }
            switch (fh) {
                case ">":
                    if (!(value > val)) isFit = 0;
                    break;
                case "<":
                    if (!(value < val)) isFit = 0;
                    break;
                case ">=":
                    if (!(value >= val)) isFit = 0;
                    break;
                case "<=":
                    if (!(value <= val)) isFit = 0;
                    break;
                case "=":
                    if (!(value == val)) isFit = 0;
                    break;
                case "is":
                    if (!(value == val)) isFit = 0;
                    break;
                case "like":
                    if (!(value.indexOf(val) != -1)) isFit = 0;
                    break;
                default:
            }
        }

        if (isFit == 1) {
            m_style = LevelStyle.ClassList[i].OLStyle;
            break;
        }
    }
    return m_style;
}

//根据样式Json对象获取当前Zoom,当前Feature的Stylefunction
function getStyleFun(styleJsonObj) {
    var _StyleFun = function (feature, resolution) {
        var m_LevelStyle = getLevelStylebyZoom(map.getView().getZoom(), styleJsonObj);
        var m_style;

        if (m_LevelStyle != null) {
            if (m_LevelStyle.RenderField == "")//如果不分类显示
            {
                m_style = getOLStylebyJson(m_LevelStyle.ClassList[0].OLStyle);
            }
            else //分类显示
            {
                m_style = getOLStylebyJson(getOLStyleFeat(m_LevelStyle, feature));
            }
            if (m_style != null) {
                m_style.getText().setText(feature.get(m_LevelStyle.DiplayField));
            }
        }
        return m_style;
    }
    return _StyleFun;

}

////////////////////生成简单渲染styleJson文件////////////////////////////////////////////////

//提供对外调用函数，获取点，简单渲染样式json文件
function getSimplePointStyleJson() {
    var myPointStyle = getNewZGStyle();//新建样式，以拷贝模板的方式
    myPointStyle.StyleId = "";
    myPointStyle.StyleName = "默认点样式";
    myPointStyle.StyleType = "point";

    var myLevelItem = getNewLevelStyle();//新建级别控制，以拷贝模板的方式
    myLevelItem.RenderField = "";
    myLevelItem.DiplayField = "";
    myLevelItem.Level = 18;

    var myClassItem = getNewClassStyle();//新建分类控制，以拷贝模板的方式
    myClassItem.FilterString = "";

    myLevelItem.ClassList.push(myClassItem);
    myPointStyle.LevelList.push(myLevelItem);

    return myPointStyle;
}

//提供对外调用函数，获取线，简单渲染样式json文件
function getSimplePolylineStyleJson() {
    var myPolylineStyle = getNewZGStyle();//新建样式，以拷贝模板的方式
    myPolylineStyle.StyleId = "";
    myPolylineStyle.StyleName = "默认线样式";
    myPolylineStyle.StyleType = "polyline";

    var myLevelItem = getNewLevelStyle();//新建级别控制，以拷贝模板的方式
    myLevelItem.RenderField = "";
    myLevelItem.DiplayField = "";
    myLevelItem.Level = 18;

    var myClassItem = getNewClassStyle();//新建分类控制，以拷贝模板的方式
    myClassItem.FilterString = "";

    myLevelItem.ClassList.push(myClassItem);
    myPolylineStyle.LevelList.push(myLevelItem);

    return myPolylineStyle;
}

//提供对外调用函数，获取面，简单渲染样式文件
function getSimplePolygonStyleJson() {
    var myPolygonStyle = getNewZGStyle();//新建样式，以拷贝模板的方式
    myPolygonStyle.StyleId = "";
    myPolygonStyle.StyleName = "默认面样式";
    myPolygonStyle.StyleType = "polygon";

    var myLevelItem = getNewLevelStyle();//新建级别控制，以拷贝模板的方式
    myLevelItem.RenderField = "";
    myLevelItem.DiplayField = "";
    myLevelItem.Level = 18;

    var myClassItem = getNewClassStyle();//新建分类控制，以拷贝模板的方式
    myClassItem.FilterString = "";

    myLevelItem.ClassList.push(myClassItem);
    myPolygonStyle.LevelList.push(myLevelItem);

    return myPolygonStyle;
}

////////////////////生成简单渲染styleJson文件////////////////////////////////////////////////

////////////////////根据json对象为图层设置样式///////////////////////////////////////////////

function setStylebyJson(layer,styleJson){
    //用于初始化图片填充面，生成img对象
    for (var i = 0; i < styleJson.LevelList.length; i++) {
        (function(i){
            for (var j = 0; j < styleJson.LevelList[i].ClassList.length; j++) {
                (function(j){
                    var classitem =styleJson.LevelList[i].ClassList[j];
                    if(classitem.OLStyle.Fill.imgsrc !="") //如果imgsrc不为空，则初始化img对象，并给json赋值
                    {
                        var img = new Image();
                        img.src= classitem.OLStyle.Fill.imgsrc;
                        classitem.OLStyle.Fill.img=img;
                    }
                })(j);
            }
        })(i);
    }
    layer.setStyle(getStyleFun(styleJson));
}

function getStylebyJson(styleJson){
    //用于初始化图片填充面，生成img对象
    for (var i = 0; i < styleJson.LevelList.length; i++) {
        (function(i){
            for (var j = 0; j < styleJson.LevelList[i].ClassList.length; j++) {
                (function(j){
                    var classitem =styleJson.LevelList[i].ClassList[j];
                    if(classitem.OLStyle.Fill.imgsrc !="") //如果imgsrc不为空，则初始化img对象，并给json赋值
                    {
                        var img = new Image();
                        img.src= classitem.OLStyle.Fill.imgsrc;
                        classitem.OLStyle.Fill.img=img;
                    }
                })(j);
            }
        })(i);
    }
    return getStyleFun(styleJson);
}

////////////////////根据json对象为图层设置样式////////////////////////////////////////////////